const ArticleModel = require('../models/articleModel');
const appError = require('../utils/appError');

class ArticleService {
  // 检查文章名是否已存在
  async isTitleExist (title) {
    const article = await ArticleModel.findOne({ title });
    return !!article;
  }

  // 创建文章
  async create(data, created_by) {
    // 验证必填字段
    if (!data.title || !data.content) {
      appError(400, '文章标题和内容都是必填项', {
        title: !data.title ? '文章标题是必填项' : null,
        content: !data.content ? '文章内容是必填项' : null
      });
    }

     // 检查文章名是否存在
     const exists = await this.isTitleExist(data.title);
     if (exists) {
       appError(409, '文章名已存在');
     }

    // 创建新文章
    const newArticle = new ArticleModel({ ...data, created_by });
    
    await newArticle.save();
    return newArticle;
  }

  // 更新文章
  async update(data, updated_by) {
    const article_id = data.id
    const article = await ArticleModel.findOne({ article_id });
    if (!article) {
      appError(400, '文章不存在');
    }
    await ArticleModel.updateOne({ article_id }, { $set: { ...data, updated_by } });
    return await ArticleModel.findOne({ article_id });
  }

  // 删除文章
  async delete(article_id) {
    const article = await ArticleModel.findOne({ article_id });
    if (!article) {
      appError(400, '文章不存在');
    }
    await ArticleModel.deleteOne({ article_id });
  }

  // 获取单个文章
  async findOne(article_id) {
    return await ArticleModel.findOne({ article_id });
  }

  // 获取所有文章
  async findAll() {
    const data = await ArticleModel.find();
    data.forEach(item => {
      item.content = item.content.length < 20 ? item.content : item.content.substring(0, 20) + '...'
    })
    return data
  }
}

module.exports = new ArticleService();